package LIst;

public class MySingleList {

    static class ListNode{
        public int val;
        public ListNode next;
        public ListNode(int val){
            this.val=val;
            this.next=null;//更简单
        }
//        private int usedSize=0;//此处是记录节点的个数
    }
    public ListNode head=new ListNode(0);//头节点
    //不需要头节点的，
    //给头节点的
    public ListNode cur=new ListNode(0);//作为一个中间商，
    //帮助我遍历，等等
    public void addFirst(int data){
        if(null==head.next){//这种情况，就是链表为null
            head.next=new ListNode(data);
            head.next.next=null;
            head.val++;
        }
        else {
            cur= new ListNode(data);//赋值这一步在此处已经赋值了。
            cur.next = head.next;
            head.next = cur;
            head.val++;
            //这里借用了cur，用完后里面放的是插入元素的值，但是这也没有用
            //这个根本就不用往后走，或者说就是只走了一步
        }
    }
    public void addLast(int data){
            cur=head;//这里主要看你怎么起步了。
            if (cur.next==null){//不要这种情况可以吗？
                head.next=new ListNode(data);
                head.next.next=null;//
                head.val++;
            }
        while(cur.next!=null){
            if(cur.next.next==null){
                cur.next.next=new ListNode(data);
                cur.next.next.next=null;
                head.val++;
                break;
            }
            cur=cur.next;
        }
    }
    public void addIndex(int index,int data){
        if(index<0||index>size()){
            //此处都是有错的
            //都是在范围之外

        }
        if(index==0){//头插法
            addFirst(data);
        }
        if(index==size()){//尾插法
            addLast(data);
        }
        cur=head.next;
        for (int i = 1; i <index; i++) {
            //不能改变head。
            //必须使用游标，
            cur=cur.next;
        }
        ListNode curtmp=new ListNode(data);
        curtmp.next=cur.next;
        cur.next=curtmp;
        head.val++;
    }
    public boolean contains(int key){
    cur=head;
    while(cur.next!=null){
        if(cur.val==key){
            return true;
        }
        cur=cur.next;
    }
        return false;
    }
    public void remove(int key){
        cur=head;
        ListNode listNode=new ListNode(0);
        listNode=cur.next;
        while(listNode!=null){
            if(listNode.val==key){
                cur.next=listNode.next;
                break;
            }
            cur=cur.next;
            listNode=cur;
        }
    }
    public void removeAllKey(int key){
        cur=head;
        ListNode listNode=new ListNode(0);
        listNode=cur.next;
        while(listNode!=null){
            if(listNode.val==key){
                cur.next=listNode.next;
                listNode=listNode.next;
                continue;
            }
            cur=cur.next;
            listNode=cur.next;
        }

    }

    public int size(){
        int count=0;
        cur=head;
        while(cur.next!=null){
            count++;
            cur=cur.next;
        }
        return count;
    }

    public void clear(){
        head.next=null;
    }
    public void display(){
        cur=head.next;
        while(cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }
}
class MySingleListTest{
    public static void main(String[] args) {
        MySingleList mySingleList=new MySingleList();
    //调用者并不用感知头节点的存在，
        mySingleList.addFirst(1);

        mySingleList.addFirst(2);
        mySingleList.addFirst(3);
        mySingleList.addLast(0);
        mySingleList.addIndex(1,-3);
        mySingleList.addIndex(1,-3);
        //mySingleList.clear();
        System.out.println(mySingleList.contains(3));
        mySingleList.display();
        mySingleList.removeAllKey(-3);
        mySingleList.display();

        System.out.println("=================");
        System.out.println(mySingleList.size());
        System.out.println("=================");
        //mySingleList.display();
        System.out.println("=================");
    }
}